package api;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.Collections;

import interfaces.*;

//Un objeto que extienda ObjetoDominio tiene que implementar notificarMensaje() de Notificable para
//generar los sucesos y mandarlos a la api con api.registrarSuceso(suceso
public abstract class ObjetoDominio implements Notificable  {
	 
	private List<Respuesta> respuestas; //Una lista de respuestas que el ObjetoDominio sabe interpretar
	private Notificador elementoDominio; //Un elemento del dominio que va a notificar cambios de estado
	
	public ObjetoDominio(Notificador elementoDominio){		
		this.elementoDominio = elementoDominio;
		elementoDominio.registrarObservador(this);
		this.respuestas = new ArrayList<Respuesta>();
	}
	
	public Object getElementoDominio() {
		return elementoDominio;
	}
	
	// Recibe respuesta de la API y llama a "interpretarRespuesta" para cada respuesta recibida que sepa interpretar
	private void interpretarRespuestas(List<Respuesta> respRecibidas){
		Iterator<Respuesta> itRecibidas = respRecibidas.iterator();
		while (itRecibidas.hasNext()){			
			Respuesta resp1 = itRecibidas.next();			
			boolean seguir = true;
			Iterator<Respuesta> itPropias = this.respuestas.iterator();
			while (itPropias.hasNext() && seguir){
				Respuesta resp2 = itPropias.next();				
				if (resp2.equals(resp1)) {
					this.interpretarRespuesta(resp1);
					seguir = false;
				}
			}
		}	
	}
		
	// Metodo utilizado por interpretarRespuestas en una respuesta que sabe interpretar
	// Se implementa en cada clase descendiente
	// Aca se llama a los metodos del elementoDominio
	public abstract void interpretarRespuesta(Respuesta respuesta);
	
	// Enviar sucesos ocurridos a la api
	protected void enviarSuceso(Suceso suceso){		
		API api = API.obtenerInstancia();		
		api.registrarSuceso(suceso);
	}	
	
	// Agrega una respuesta a la lista de respuestas, valida unicidad con equals
	protected void agregarRespuesta(Respuesta respuesta) {
		if (!this.respuestas.contains(respuesta)) this.respuestas.add(respuesta);		
	}
	
	public void generarRespuestas() {
		List<Respuesta> respuestas = new ArrayList<Respuesta>();		
		Iterator<Respuesta> itRespPropias = this.respuestas.iterator();		
		while (itRespPropias.hasNext()){
			Respuesta respPropia = itRespPropias.next();			
			//if (this.controlarNecesarios(respPropia)) respuestas.add(respPropia);			
		}		
		if (respuestas.size() > 0) this.interpretarRespuestas(respuestas);
	}
	
	
}
